package com.s3u4.concurrence.disruptor;

import com.lmax.disruptor.BlockingWaitStrategy;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;

import java.nio.ByteBuffer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by Captain on 02/04/2018.
 */
public class Client {

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        PCDataFactory factory = new PCDataFactory();

        int bufferSize = 1024;

        Disruptor<PCData> disruptor = new Disruptor<>(factory,bufferSize,executorService, ProducerType.MULTI,new BlockingWaitStrategy());

        disruptor.handleEventsWithWorkerPool(new Consumer(),new Consumer(),new Consumer(),new Consumer(),new Consumer());

        disruptor.start();

        RingBuffer<PCData> ringBuffer = disruptor.getRingBuffer();
        Producer producer = new Producer(ringBuffer);

        ByteBuffer byteBuffer = ByteBuffer.allocate(8);

        for ( long i = 0 ; true ; i++){
            byteBuffer.clear();
            byteBuffer.putLong(0,i);
            producer.pushData(byteBuffer);
            Thread.sleep(100);

            System.out.println("add Data : " + i);
        }


    }

}
